Indice

  • Intro
  • Shiny, micro-teoría y componentes
  • Manos a la obra: demo
  • plotly, leaflet, dygraphs, highcharter (render dinámico)
  • Cuándo usar cada una.

Shiny: micro-teoría

ui + server + reactividad → render*()*Output()

# pseudo-esqueleto

ui <- fluidPage(
  sliderInput("n", "N:", 10, 100, 50),
  plotOutput("p")
)

server <- \(input, output, session){
  datos <- reactive({ rnorm(input$n) })
  output$p <- renderPlot({ hist(datos(), main= "Histograma", xlab="Datos", ylab="Frecuencia") })
}

shinyApp(ui, server)
expandir para código
DiagrammeR::grViz("
digraph shiny_diagram {
  rankdir=TB; // Dirección de arriba hacia abajo
  
  // Fondo general
  bgcolor='#F7F7F7';

  // Estilo de nodos
  graph [fontname='storia-sans'];
  node [shape=box, style=filled, fontname='storia-sans', fontsize=14, color=gray90];
  edge  [fontname='storia-sans', fontcolor=black, fontsize=12];
  
  // Cluster UI
  subgraph cluster_UI {
    label = 'UI (Frontend)';
    color = '#B03A2E'; // Color del borde del cluster
    style = rounded;
    fillcolor = '#F1948A'; // Fondo claro
    
    UI_input [label = 'Input', fillcolor='#9682fc50', color='#9682fc'];
    UI_output [label = 'Output', fillcolor='#01c9ad50', color='#01c9ad'];
  }

  // Nodo del servidor
  SERVER [label = 'Server (Backend)', shape=ellipse, fillcolor='#F1948A', color='#619CFF', style=solid];

  // Conexiones con etiquetas
  UI_input -> SERVER [label = 'Datos del\nusuario', fontname='storia-sans', fontcolor=black, fontsize=12];
  SERVER -> UI_output [label = 'Resultados', fontname='storia-sans', fontcolor=black, fontsize=12];

  // Alineación lógica
  {rank=same; UI_input; UI_output;}
}
")

Esquema: Estructura y reactividad

Algunos ejemplos

Hacer una imágen dinámica

df <- tibble::tibble( #generamos una base de datos
  categoria = c("Antidepresivos", "Marihuana", "Ansiolíticos", "Alcohol", 
                "Hipnóticos", "Cocaína"),
  n = c(120, 90, 70, 25, 18, 10)
)
plotly::plot_ly( #generamos la primera entrada del gráfico interactivo
  df, #defino la base de datos
  labels = ~categoria, #donde se encuentra la etiqueta de las categorías y a qué columna refiere en la 
  #base de datos. Nótese la virgulilla
  values = ~n, #donde se encuentra el valor numérico y a qué columna refiere en la base de datos
  type   = "pie", #tipo de gráfico. EN este caso, de torta
  textinfo = "label+percent", #qué información mostrar en el gráfico
  hovertemplate = "<b>%{label}</b><br>N: %{value}<extra></extra>" #formato del tooltip (lo que aparece 
  #al posar el mouse sobre un sector)
) |> #sintaxis pipe, que nos permite encadenar funciones
  plotly::layout(title = "'¿Qué sustancia consume semanalmente?'") |>  #título del gráfico
  plotly::layout(legend = list(title = list(text = "<b> Categorías </b>")))|> #título de la leyenda. las b negritas 
  #se hacen con html
  layout( #otras opciones de formato
    paper_bgcolor = "rgba(0,0,0,0)",  # → fondo del lienzo
    plot_bgcolor  = "rgba(0,0,0,0)"   # → fondo del área de trazado
  )

Consideraciones sobre Shiny

  • Requiere conocimientos en HTML y CSS para personalizaciones avanzadas.

  • Shiny es una aplicación web: pensar en usuarios, inputs, outputs, validaciones, errores.

  • Al funcionar como aplicación independiente, es importante considerar recursos de despliegue y alojamiento.

  • Para auditar (logger) + logs más detallados: options(shiny.fullstacktrace = TRUE)

Aplicaciones más allá del módulo

  • ShinyQDA: Aplicación para análisis cualitativo de datos.

  • Shinydashboard: Paquete para crear dashboards interactivos con Shiny.

  • Flexdashboard: Paquete para crear dashboards flexibles y responsivos.

  • R Shiny Gallery: Colección de ejemplos y aplicaciones Shiny.

  • shinytest2: Paquete para pruebas automatizadas de aplicaciones Shiny.

  • Asistente Shiny (AI): Herramienta para generar código Shiny utilizando inteligencia artificial.

Nos vemos en clase!

Si le interesa:

  • Descargue el código fuente desde este este script

  • Genere una aplicación en Shiny

  • Explore paso por paso e indique qué se hizo

Fuentes

  • Breuer, J., & Aust, F. (2022, 27-28 de Abril). Reproducible research workflows for psychologists: Other topics in reproducible research [Presentation]. KU Leuven. Obtenido desde: https://frederikaust.com/reproducible-research-practices-workshop/slides/7_Other_Topics.html

  • Wembo, J. (2024, 24 de Septiembre). Learn Docker. DataCamp. https://www.datacamp.com/blog/learn-docker

  • Plaza-Vega, F. (2024). Mini curso: Quarto y GitHub Pages. III Jornadas de Ingeniería Estadística 202, 11 y 12 de Noviembre 2024, Auditorio DMCC Universidad de Santiago de Chile. https://github.com/FranPlaza/Quarto-Github

  • Xie, Y. (2024). Dynamic Documents with R and Quarto (2nd ed.). Chapman and Hall/CRC. https://quarto.org

  • The Jumping Rivers Blog. (2025, 30 de junio). Building trust with code: Validating Shiny apps in regulated environments. R-Bloggers. https://www.r-bloggers.com/2025/06/building-trust-with-code-validating-shiny-apps-in-regulated-environments-2/

  • Tutorial oficial de Shiny. (s.f.). Shiny from RStudio. Obtenido 04 de Noviembre de 2025, desde https://shiny.posit.co/r/getstarted/

  • Galería de ejemplos de Shiny. (s.f.). Shiny from RStudio. Obtenido 04 de Noviembre de 2025, desde https://shiny.posit.co/gallery/

  • Wickham, H. (2021). Mastering Shiny [versión en línea]. Recuperado el 3 de noviembre de 2025, de https://mastering-shiny.org/